通过Pytorch代码可视化理解卷积神经网络

您所在的位置:网站首页 pytorch 可视化 通过Pytorch代码可视化理解卷积神经网络

通过Pytorch代码可视化理解卷积神经网络

#通过Pytorch代码可视化理解卷积神经网络| 来源: 网络整理| 查看: 265

本文代码地址: https://github.com/AINewHorizon/visualising-cnns

机器在理解和识别图像中的特征和对象方面已经达到了99%的准确度。智能手机可以识别相机中的脸部;能够使用Google图像搜索特定照片; 从条形码或书籍扫描文本。所有这一切都归功于卷积神经网络(CNN),这是一种特殊类型的神经网络,也称为  convnet。

如果你是一个深度学习[1]爱好者,你可能已经听说过卷积神经网络,也许你自己甚至开发了一些图像分类器。像Tensorflow和PyTorch这样的现代深度学习框架可以很容易地向机器训练图像,但是,仍然存在一些问题,如数据如何通过神经网络的人工层?计算机如何从中学习?如何更好地解释卷积神经网络。因此让我们通过每一层可视化图像,深入了解CNN。

卷积神经网络 卷积神经网络解释 什么是卷积神经网络?

卷积神经网络(CNN)是一种特殊类型的神经网络,在图像上工作得非常好。由Yan LeCun于1998年提出,卷积神经网络可以识别给定输入图像中存在的数字。

在开始使用卷积神经网络之前,了解神经网络的工作原理非常重要。神经网络模仿人类大脑如何解决复杂问题并在给定数据集中找到模式。在过去几年中,神经网络已经吞噬了许多机器学习和计算机视觉算法[2]。

神经网络的基本模型由组织在不同层中的神经元组成。每个神经网络都有一个输入和一个输出层,根据问题的复杂性增加了许多隐藏层。一旦数据通过这些层,神经元就会学习并识别模式。神经网络的这种表示称为模型。一旦模型被训练,我们要求网络根据测试数据进行预测。如果您是神经网络的新手,那么关于Python深度学习的[3]这篇文章是一个很好的起点。

另一方面,CNN是一种特殊类型的神经网络,它在图像上工作得非常好。由Yan LeCun于1998年提出,卷积神经网络可以识别给定输入图像中存在的数字。使用CNN的其他应用包括语音识别,图像分割和文本处理。在卷积神经网络之前,多层感知器(MLP)被用于构建图像分类器。

图像分类是指从多波段光栅图像中提取信息类的任务。多层感知器需要更多时间和空间来查找图片中的信息,因为每个输入特征都需要与下一层中的每个神经元连接。CNN通过使用称为局部连接的概念来超越MLP,该概念涉及将每个神经元连接到仅输入音量的局部区域。这通过允许网络的不同部分专门处理诸如纹理或重复模式的高级特征来最小化参数的数量。迷茫?别担心。让我们比较一下如何通过多层感知器和卷积神经网络发送图像,以便更好地理解。

比较MLPS和CNNS

考虑到MNIST数据集,多层感知器的输入层的条目总数将为784,因为输入图像的大小为28x28 = 784。网络应该能够预测给定输入图像中的数字,这意味着输出可能属于以下任何类别,范围从0-9(1,2,3,4,5,6,7,8,9) )。在输出层,我们返回类别分数,比如说给定输入是一个数字为"3"的图像,那么在输出层中,相应的神经元"3"与其他神经元相比具有更高的类别分数。**我们需要包含多少个隐藏层以及每个隐藏层应该包含多少个神经元?**这是一个编码MLP的示例:

卷积神经网络pytorch可视化mlp

上面的代码片段使用名为Keras的框架实现(暂时忽略语法)。它告诉我们在第一个隐藏层中有512个神经元,它们连接到形状784的输入层。隐藏层后面是一个丢失层,它克服了过度拟合的问题**。**0.2表示在第一个隐藏层之后没有考虑神经元的可能性为20%。同样,我们添加了第二个隐藏层,其具有与第一个隐藏层(512)中相同数量的神经元,然后是另一个丢失层。最后,我们以包含10个类的输出层结束这组图层。具有最高值的该类将是模型预测的数量。

这是在定义所有层之后多层网络的样子。这种多层感知器的一个缺点是连接完整(完全连接)以供网络学习,这需要更多的时间和空间。MLP只接受向量作为输入。

卷积神经网络pytorch可视化图像分类器

卷积不使用全连接层,而是稀疏连接的层,即它们接受矩阵作为输入,这是优于MLP的优势。输入功能连接到本地编码节点。在MLP中,每个节点都有责任了解整个画面。在CNN中,我们将图像分解为区域(像素的小局部区域)。每个隐藏节点必须向输出层报告,其中输出层将接收的数据组合以查找模式。下图显示了各层如何在本地连接。

卷积神经网络pytorch可视化cnn

在我们了解CNN如何在图片中查找信息之前,我们需要了解如何提取这些功能。卷积神经网络使用不同的层,每层保存图像中的特征。例如,考虑一张狗的照片。每当网络需要对狗进行分类时,它应该识别所有特征 - 眼睛,耳朵,舌头,腿等 - 并且使用滤波器和内核在网络的本地层中分解和识别这些特征。

计算机如何理解图像?

与通过用眼睛拍摄快照来理解图像的人类不同,计算机使用0到255之间的一组像素值来理解图像。计算机查看这些像素值并理解它们。乍一看,它不知道对象或颜色,它只是识别像素值,这是计算机的所有图像。

在分析像素值之后,计算机慢慢开始了解图像是灰度还是彩色。它知道差异,因为灰度图像只有一个通道,因为每个像素代表一种颜色的强度。零表示黑色,255表示白色,黑色和白色的其他变化,即灰色位于两者之间。另一方面,彩色图像有三个通道 - 红色,绿色和蓝色。这些代表三种颜色(3D矩阵)的强度,当值同时变化时,它会产生一组颜色!在计算出颜色属性后,计算机会识别图像中对象的曲线和轮廓。

可以在卷积神经网络中使用PyTorch来加载数据集并对图像应用滤波器来探索该过程。以下是代码段。

# Load the librariesimport torchimport numpy as np

from torchvision import datasetsimport torchvision.transforms as transforms

# Set the parametersnum_workers = 0batch_size = 20

# Converting the Images to tensors using Transformstransform = transforms.ToTensor()

train_data = datasets.MNIST(root='data', train=True, download=True, transform=transform)test_data = datasets.MNIST(root='data', train=False, download=True, transform=transform)

# Loading the Datatrain_loader = torch.utils.data.DataLoader(train_data, batch_size=batch_size, num_workers=num_workers)test_loader = torch.utils.data.DataLoader(test_data, batch_size=batch_size, num_workers=num_workers)

import matplotlib.pyplot as plt%matplotlib inline

dataiter = iter(train_loader)images, labels = dataiter.next()images = images.numpy()

# Peeking into datasetfig = plt.figure(figsize=(25, 4))for image in np.arange(20): ax = fig.add_subplot(2, 20/2, image+1, xticks=[], yticks=[]) ax.imshow(np.squeeze(images[image]), cmap='gray') ax.set_title(str(labels[image].item()))

卷积神经网络pytorch可视化输入数据

现在让我们看看如何将单个图像输入神经网络。

img = np.squeeze(images[7])

fig = plt.figure(figsize = (12,12))ax = fig.add_subplot(111)ax.imshow(img, cmap='gray')width, height = img.shapethresh = img.max()/2.5for x in range(width): for y in range(height): val = round(img[x][y],2) if img[x][y] !=0 else 0 ax.annotate(str(val), xy=(y,x), color='white' if img[x][y]



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3